GtkLabel: Add private api for links
authorMatthias Clasen <mclasen@redhat.com>
Sat, 4 Jan 2014 02:00:44 +0000 (21:00 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 4 Jan 2014 15:54:03 +0000 (10:54 -0500)
This exposes enough information to implement the AtkHyperText
interface.

More private link api

gtk/gtklabel.c
gtk/gtklabelprivate.h

index 8d06be7bc29c24cab95b8ad6724af758816a4df0..8f1ef1fe47c6b56ac0e59c758545a4cc72c07125 100644 (file)
@@ -6581,3 +6581,156 @@ gtk_label_get_lines (GtkLabel *label)
 
   return label->priv->lines;
 }
+
+gint
+_gtk_label_get_n_links (GtkLabel *label)
+{
+  GtkLabelPrivate *priv = label->priv;
+
+  if (priv->select_info)
+    return g_list_length (priv->select_info->links);
+
+  return 0;
+}
+
+const gchar *
+_gtk_label_get_link_uri (GtkLabel *label,
+                         gint      idx)
+{
+  GtkLabelPrivate *priv = label->priv;
+  gint i;
+  GList *l;
+  GtkLabelLink *link;
+
+  if (priv->select_info)
+    for (l = priv->select_info->links, i = 0; l; l = l->next, i++)
+      {
+        if (i == idx)
+          {
+            link = l->data;
+            return link->uri;
+          }
+      }
+
+  return NULL;
+}
+
+void
+_gtk_label_get_link_extent (GtkLabel *label,
+                            gint      idx,
+                            gint     *start,
+                            gint     *end)
+{
+  GtkLabelPrivate *priv = label->priv;
+  gint i;
+  GList *l;
+  GtkLabelLink *link;
+
+  if (priv->select_info)
+    for (l = priv->select_info->links, i = 0; l; l = l->next, i++)
+      {
+        if (i == idx)
+          {
+            link = l->data;
+            *start = link->start;
+            *end = link->end;
+            return;
+          }
+      }
+
+  *start = -1;
+  *end = -1;
+}
+
+gint
+_gtk_label_get_link_at (GtkLabel *label, 
+                        gint      pos)
+{
+  GtkLabelPrivate *priv = label->priv;
+  gint i;
+  GList *l;
+  GtkLabelLink *link;
+
+  if (priv->select_info)
+    for (l = priv->select_info->links, i = 0; l; l = l->next, i++)
+      {
+        link = l->data;
+        if (link->start <= pos && pos < link->end)
+          return i;
+      }
+
+  return -1;
+}
+
+void
+_gtk_label_activate_link (GtkLabel *label, 
+                          gint      idx)
+{
+  GtkLabelPrivate *priv = label->priv;
+  gint i;
+  GList *l;
+  GtkLabelLink *link;
+
+  if (priv->select_info)
+    for (l = priv->select_info->links, i = 0; l; l = l->next, i++)
+      {
+        if (i == idx)
+          {
+            link = l->data;
+            emit_activate_link (label, link);
+            return;
+          }
+      }
+}
+
+gboolean
+_gtk_label_get_link_visited (GtkLabel *label,
+                             gint      idx)
+{
+  GtkLabelPrivate *priv = label->priv;
+  gint i;
+  GList *l;
+  GtkLabelLink *link;
+
+  if (priv->select_info)
+    for (l = priv->select_info->links, i = 0; l; l = l->next, i++)
+      {
+        if (i == idx)
+          {
+            link = l->data;
+            return link->visited;
+          }
+      }
+
+  return FALSE;
+}
+
+gboolean
+_gtk_label_get_link_focused (GtkLabel *label,
+                             gint      idx)
+{
+  GtkLabelPrivate *priv = label->priv;
+  gint i;
+  GList *l;
+  GtkLabelLink *link;
+  GtkLabelSelectionInfo *info = priv->select_info;
+
+  if (!info)
+    return FALSE;
+
+  if (info->selection_anchor != info->selection_end)
+    return FALSE;
+
+  for (l = info->links, i = 0; l; l = l->next, i++)
+    {
+      if (i == idx)
+        {
+          link = l->data;
+          if (link->start <= info->selection_anchor &&
+              info->selection_anchor <= link->end)
+            return TRUE;
+        }
+    }
+
+  return FALSE;
+}
index e8fe1b29a2b8c6e8db96f195af1d43e0d3107d31..f99c50fca5a127f2de1dc8bcb3d9f827703deaec 100644 (file)
@@ -29,6 +29,22 @@ void _gtk_label_mnemonics_visible_apply_recursively (GtkWidget *widget,
 gint _gtk_label_get_cursor_position (GtkLabel *label);
 gint _gtk_label_get_selection_bound (GtkLabel *label);
 
+gint         _gtk_label_get_n_links     (GtkLabel *label);
+gint         _gtk_label_get_link_at     (GtkLabel *label,
+                                         gint      pos);
+void         _gtk_label_activate_link   (GtkLabel *label, 
+                                         gint      idx);
+const gchar *_gtk_label_get_link_uri    (GtkLabel *label,
+                                         gint      idx);
+void         _gtk_label_get_link_extent (GtkLabel *label,
+                                         gint      idx,
+                                         gint     *start,
+                                         gint     *end);
+gboolean     _gtk_label_get_link_visited (GtkLabel *label,
+                                          gint      idx);
+gboolean     _gtk_label_get_link_focused (GtkLabel *label,
+                                          gint      idx);
+                             
 G_END_DECLS
 
 #endif /* __GTK_LABEL_PRIVATE_H__ */